/**
 * 加密 & Token生成
 * 类似于jsonwebtoken模块，优于jsonwebtoken
 * 缺点：自行判定是否失效，若在没失效时候退出系统，原token还可以使用
 * 使用：简单系统可以使用，复杂系统需要搭配redis，实现过期自动删除
 * token加密密钥使用用户密码，可以确保用户在修改密码之后token会失效
 * @author Huisir q273250950
 */
const serect = 'abc..123'	//密钥，不能丢
const timeout = 1000 * 60 * 30	//过期时间（半小时）

module.exports = {
	//创建token，不使用redis
	creatToken(userid){
		let curTime = Date.now()	//当前时间戳
		let curTime32 = curTime.toString(32)	//转为32进制
		return this.encrypt(`${userid},${curTime32},${timeout}`,serect)
	},
	
	//解析token，不使用redis
	decodeToken(token){
		let [userid,curTime32,timeout] = this.decrypt(token,serect).split(',')
		let curTime = parseInt(curTime32,32)	//转为10进制
		return [userid,curTime,timeout]
	},
	
	//创建token，搭配redis，过期时间在redis处配置
	//redis存储的时候key为userid，value为token,相当于一个登陆用户在redis中只有一条
	//使用redis的话，加密密钥为用户密码，可以确保在修改密码之后token失效
	creatToken1(userid,skey){
		let curTime = Date.now()	//当前时间戳(保证每次生成不同的token)
		let curTime32 = curTime.toString(32)	//转为32进制
		return this.encrypt(`${userid},${curTime32}`,skey)
	},
	
	//解析token，搭配redis
	decodeToken2(token,skey){
		let [userid,curTime32] = this.decrypt(token,skey).split(',')
		return userid
	},
	
	//加密
	encrypt(str,skey){
		let strArr = Buffer.from(str+skey).toString('base64').split('')	//Base64
		strArr.reverse()	//逆序
		let enStr = strArr.join('').replace(/=/g,"$")	//将=替换
		return enStr
	},
	
	//解密
	decrypt(pass,skey){
		let strArr = pass.replace(/\$/g,"=").split('')
		strArr.reverse()	//逆序
		str = Buffer.from(strArr.join(''),'base64').toString().split(skey)[0]
		return str
	}
}